# 设置 CMake 的最低版本要求为 3.5，并在不满足时报致命错误
cmake_minimum_required ( VERSION 3.5 FATAL_ERROR )

# 定义项目名称为 "recipe-10"，并指定使用的语言为 C++
project ( recipe-10 LANGUAGES CXX )

# 创建一个静态库目标 "geometry"，并列出相关的源文件和头文件
add_library ( geometry
  STATIC
    geometry_circle.cpp # 源文件：圆相关实现
    geometry_circle.hpp # 头文件：圆相关声明
    geometry_polygon.cpp # 源文件：多边形相关实现
    geometry_polygon.hpp # 头文件：多边形相关声明
    geometry_rhombus.cpp # 源文件：菱形相关实现
    geometry_rhombus.hpp # 头文件：菱形相关声明
    geometry_square.cpp # 源文件：正方形相关实现
    geometry_square.hpp # 头文件：正方形相关声明
)

# 为目标 "geometry" 设置私有编译选项 "-O3"（最高级别优化）
target_compile_options ( geometry
  PRIVATE
    -O3 # 编译器优化标志：启用最高级别优化
)

# 创建一个列表 "sources_with_lower_optimization"，包含需要降低优化级别的源文件
list (
  APPEND sources_with_lower_optimization
    geometry_circle.cpp # 将圆相关源文件加入列表
    geometry_rhombus.cpp # 将菱形相关源文件加入列表
)

# 使用 IN LISTS 语法循环遍历 "sources_with_lower_optimization" 列表
message ( STATUS "Setting source properties using IN LISTS syntax:" ) # 打印状态信息

foreach ( _source IN LISTS sources_with_lower_optimization ) # 遍历列表中的每个源文件
  set_source_files_properties ( ${_source} PROPERTIES COMPILE_FLAGS -O2 ) # 设置每个源文件的编译标志为 "-O2"
  message ( STATUS "Appending -O2 flag for ${_source}" ) # 打印状态信息，表明已为该文件设置 "-O2"
endforeach ()

# 使用普通的 foreach 语法查询源文件属性，演示如何展开变量内容
message ( STATUS "Querying sources properties using plain syntax:" ) # 打印状态信息

foreach ( _source ${sources_with_lower_optimization} ) # 遍历展开后的列表内容
  get_source_file_property ( _flags ${_source} COMPILE_FLAGS ) # 获取源文件的编译标志
  message ( STATUS "Source ${_source} has the following extra COMPILE_FLAGS: ${_flags}" ) # 打印获取到的编译标志
endforeach ()

# 创建可执行目标 "compute-areas"，并指定其入口源文件 compute-areas.cpp
add_executable ( compute-areas compute-areas.cpp )

# 将 "geometry" 库链接到 "compute-areas" 可执行目标上
target_link_libraries ( compute-areas geometry )